package cn.foolishbird.crow.core.util;

import java.math.BigDecimal;

/**
 * 小数计算工具类
 *
 * @author  foolish-bird
 */
public final class NumberUtils {

    private NumberUtils() {

    }

    /**
     * double相加
     *
     * @param a
     * @param b
     * @return
     */
    public static double add(double a, double b) {
        return BigDecimal.valueOf(a).add(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * 浮点类型相加
     *
     * @param a
     * @param b
     * @return
     */
    public static double add(float a, float b) {
        return BigDecimal.valueOf(a).add(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * double相减
     *
     * @param a
     * @param b
     * @return
     */
    public static double subtract(double a, double b) {
        return BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * 浮点相减
     *
     * @param a
     * @param b
     * @return
     */
    public static double subtract(float a, float b) {
        return BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * double相乘
     *
     * @param a
     * @param b
     * @return
     */
    public static double multiply(double a, double b) {
        return BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * 浮点相乘
     *
     * @param a
     * @param b
     * @return
     */
    public static double multiply(float a, float b) {
        return BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(b)).doubleValue();
    }

    /**
     * double除
     *
     * @param a
     * @param b
     * @return
     */
    public static double divide(double a, double b, int newScale) {
        return divide(a, b, newScale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * double除
     *
     * @param a
     * @param b
     * @return
     */
    public static double divide(double a, double b, int newScale, int roundingMode) {
        return BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b), newScale, roundingMode).doubleValue();
    }

    /**
     * 浮点除
     *
     * @param a
     * @param b
     * @return
     */
    public static double divide(float a, float b, int newScale) {
        return divide(a, b, newScale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 浮点除
     *
     * @param a
     * @param b
     * @return
     */
    public static double divide(float a, float b, int newScale, int roundingMode) {
        return BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b), newScale, roundingMode).doubleValue();
    }

    /**
     * 保留几位小数
     *
     * @param a
     * @return
     */
    public static double round(double a) {
        return BigDecimal.valueOf(a).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

}
